"""
工厂模式示例：根据类型创建不同的处理器
简单理解：工厂就是一个"生产车间"，根据你要的类型，给你生产对应的产品
"""


class NotificationHandler:
    """通知处理器基类"""
    def send(self, message: str):
        """发送通知的抽象方法"""
        pass


class EmailHandler(NotificationHandler):
    """邮件通知处理器"""
    def send(self, message: str):
        print(f"📧 邮件通知: {message}")


class SMSHandler(NotificationHandler):
    """短信通知处理器"""
    def send(self, message: str):
        print(f"📱 短信通知: {message}")


class PushHandler(NotificationHandler):
    """推送通知处理器"""
    def send(self, message: str):
        print(f"🔔 推送通知: {message}")


class NotificationFactory:
    """通知工厂：根据类型创建对应的通知处理器"""
    
    @staticmethod
    def create_handler(handler_type: str) -> NotificationHandler:
        """
        创建通知处理器 - 工厂方法的核心实现
        
        工厂模式应用场景:
        在我们的项目中，当我们需要发送不同类型的通知时，
        可以使用工厂模式来创建对应的通知处理器，而不需要
        在业务代码中直接实例化具体的类
        
        业务场景:
        - 用户点赞帖子时发送通知
        - 用户评论帖子时发送通知
        - 系统维护时发送通知给管理员
        
        核心角色:
        1. 工厂类(NotificationFactory) - 负责创建具体产品
        2. 抽象产品(NotificationHandler) - 定义产品的接口
        3. 具体产品(EmailHandler等) - 实现具体的产品功能
        
        实现原理:
        通过字典映射不同类型到对应的类，然后动态创建实例
        
        实现流程:
        1. 客户端调用工厂方法，传入类型参数
        2. 工厂根据类型查找对应的类
        3. 工厂创建并返回对应类的实例
        4. 客户端使用返回的实例执行具体操作
        
        可能遇到的问题及优化:
        1. 问题：新增类型时需要修改工厂类
           优化：可以使用配置文件或注册机制
        2. 问题：违反开闭原则
           优化：可以使用反射机制动态加载类
        3. 问题：工厂方法可能变得臃肿
           优化：可以拆分为多个专门的工厂类
        
        为什么选择工厂模式而不是直接创建对象:
        1. 解耦：业务代码不需要知道具体类名
        2. 可扩展：添加新类型不影响现有代码
        3. 统一管理：所有对象创建集中在一处
        4. 易于维护：修改创建逻辑只需修改工厂类
        
        参数:
            handler_type: 处理器类型 ('email', 'sms', 'push')
        
        返回:
            对应的通知处理器对象
        """
        # 类型到类的映射字典 - 工厂模式的核心数据结构
        handlers = {
            'email': EmailHandler,  # 邮件处理器映射
            'sms': SMSHandler,      # 短信处理器映射
            'push': PushHandler     # 推送处理器映射
        }
        
        # 根据类型获取对应的类（转换为小写提高容错性）
        handler_class = handlers.get(handler_type.lower())
        
        # 如果没有找到对应的类，抛出异常
        if not handler_class:
            raise ValueError(f"不支持的通知类型: {handler_type}")
        
        # 创建并返回处理器实例 - 工厂模式的最终产出
        return handler_class()